#include "FontManager.h"
#include "FreeTypeFont.h"

using namespace std;

FontManager* FontManager::m_manager = NULL;

///////////////////////////////////////////////////////////////////////////////
// Constructors and Destructors
///////////////////////////////////////////////////////////////////////////////

FontManager::~FontManager(void)
{
    m_manager = NULL;
}

///////////////////////////////////////////////////////////////////////////////
// Other public methods
///////////////////////////////////////////////////////////////////////////////

FontManager* FontManager::getInstance(void)
{
    if(m_manager == NULL)
    {
        m_manager = new FontManager();
        return m_manager;
    }
    else
    {
        return m_manager;
    }
}

bool FontManager::addFont(boost::shared_ptr<FreeTypeFont> font) 
{
    bool ok = true;
    map<pair<string, int>, boost::shared_ptr<FreeTypeFont>>::iterator it = 
        m_fonts.find(make_pair(font->fontName(), font->fontSize()));
    if (it == m_fonts.end())
    {
        if (!font->initialize())
        {
            ok = false;
        }
        else
        {
            m_fonts[make_pair(font->fontName(), font->fontSize())] = font;
        }
    }

    return ok;
}

bool FontManager::hasFont(const pair<string, int>& fontDetails)
{
    bool found = true;
    map<pair<string, int>, boost::shared_ptr<FreeTypeFont>>::iterator it = m_fonts.find(fontDetails);
    if (it == m_fonts.end())
    {
        found = false;
    }
    return found;
}

void FontManager::purgeFonts(void)
{
    m_fonts.clear();
}

///////////////////////////////////////////////////////////////////////////////
// Getters
///////////////////////////////////////////////////////////////////////////////

boost::shared_ptr<FreeTypeFont> FontManager::getFont(const pair<string, int>& fontDetails) const
{
    return m_fonts.find(fontDetails)->second;
}

///////////////////////////////////////////////////////////////////////////////
// Private methods
///////////////////////////////////////////////////////////////////////////////

FontManager::FontManager(void)
{
    m_fonts.clear();
}

